package com.ruoyi.util;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @program: ChainUp_Monitor_Rear
 * @description: 合并巡检结果的工具类（已修正）
 * @author: Saumell
 * @create: 2024-08-12 17:20
 **/
public class MergeUtil {

    /**
     * 合并多个巡检任务的响应结果。
     * - 修复了处理 "true" 结果时会导致崩溃的bug。
     * - 更新了内部的 periods 数组以匹配API的实际格式，并用于生成错误报告。
     * - 优化了错误信息聚合逻辑。
     *
     * @param checkoutList 包含多个检查结果的列表
     * @return 合并后的最终结果
     */
    public static String mergerespont(List<String> checkoutList) {
        // 使用正确的、API接受的周期名称，用于最终的错误信息展示
        String[] periods = {"1m", "5m", "15m", "30m", "1h", "1d", "1w", "1M"};

        // 快速容错：若存在明显非法响应片段（如 illegal input），直接返回失败
        for (String s : checkoutList) {
            if (s != null && s.toLowerCase().contains("illegal input")) {
                return "false, 非法响应: illegal input";
            }
        }
        // 检查是否所有结果都为 "true"
        boolean allSuccess = checkoutList.stream().allMatch(result -> "true".equals(result));

        if (allSuccess) {
            return "true";
        } else {
            // 使用Map来根据相同的错误信息聚合不同的周期
            Map<String, List<String>> errorsMap = new LinkedHashMap<>();
            for (int i = 0; i < checkoutList.size(); i++) {
                String result = checkoutList.get(i);
                // 【关键修复】只处理失败的结果，跳过 "true"
                if (!"true".equals(result)) {
                    // 安全地截取 "false, " (7个字符) 之后的部分作为错误信息
                    String errorMessage = result.startsWith("false, ") ? result.substring(7) : result;
                    // 将错误信息作为key，将对应的周期名加入到value列表中
                    errorsMap.computeIfAbsent(errorMessage, k -> new ArrayList<>()).add(periods[i]);
                }
            }

            // 拼接最终的错误报告
            StringBuilder mergedResult = new StringBuilder("false, ");
            List<String> errorEntries = new ArrayList<>();
            for (Map.Entry<String, List<String>> entry : errorsMap.entrySet()) {
                String formattedEntry = String.join("/", entry.getValue())
                        + ": "
                        + entry.getKey();
                errorEntries.add(formattedEntry);
            }
            mergedResult.append(String.join("; ", errorEntries)); // 使用分号和空格分隔不同的错误类型

            return mergedResult.toString();
        }
    }
}